package handlers

import (
	"backend/internal/dao"
)

type LoginRequest struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

type RegisterRequest struct {
	Username string `json:"username"`
	Password string `json:"password"`
}

type AuthUser struct {
	dao.User
	Token string `json:"token"`
}

// func Login(c *fiber.Ctx, dbClient *gorm.DB, rdsClient *redis.Client, config *toml.Tree) error {
// 	// Parse the form data

// 	var loginRequest LoginRequest
// 	if err := c.BodyParser(&loginRequest); err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 400,
// 			Msg:  "请检查请求参数是否正确",
// 		})
// 		return err
// 	}
// 	// Validate the username and password
// 	if loginRequest.Username == "" || loginRequest.Password == "" {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 400,
// 			Msg:  "用户名和密码不能为空",
// 		})
// 		return nil
// 	}

// 	// Check if the user exists in the database
// 	var user dao.User
// 	if err := dbClient.Where("username = ?", loginRequest.Username).First(&user).Error; err != nil {
// 		if err == gorm.ErrRecordNotFound {
// 			c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 				Code: 401,
// 				Msg:  "用户不存在",
// 			})
// 			return nil
// 		}
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	encryPwd, err := encryption.EncryptionMd5(loginRequest.Password, config.Get("env.PASSWORD_SALT").(string))
// 	if err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	// Check if the password is correct
// 	if user.Password != encryPwd {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 401,
// 			Msg:  "密码错误",
// 		})
// 		return nil
// 	}
// 	// Generate a session token and store it in Redis
// 	sessionToken := encryption.EncryptionSha256(fmt.Sprint(user.Id), config.Get("env.TOKEN_SALT").(string), time.Now().String())
// 	user.Password = ""
// 	strUser, err := json.Marshal(user)
// 	if err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	err = rdsClient.Set(c.Context(), config.Get("env.AUTHORIZATION_PREFIX").(string)+sessionToken, strUser, time.Duration(config.Get("env.AUTHORIZATION_EXPIRE").(int64)*int64(time.Second))).Err()
// 	if err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	// 登录需要清除之前的登录信息
// 	preTokenInfo := rdsClient.Get(c.Context(), strconv.Itoa(int(user.Id)))
// 	preToken, err := preTokenInfo.Result()
// 	if err != nil && err != redis.Nil {
// 		// Redis 系统错误
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	if preToken != "" {
// 		rdsClient.Del(c.Context(), config.Get("env.AUTHORIZATION_PREFIX").(string)+preToken)
// 	}
// 	err = rdsClient.Set(c.Context(), config.Get("env.AUTHORIZATION_PREFIX").(string)+strconv.Itoa(int(user.Id)), sessionToken, 0).Err()
// 	if err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	// 强制关闭ws连接，避免ws重复创建
// 	if chat.CallerMap[int(user.Id)] != nil {
// 		chat.CallerMap[int(user.Id)].StopChan <- struct{}{}
// 	}
// 	// Return the session token to the client
// 	c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 		Code: 200,
// 		Msg:  "登陆成功",
// 		Data: AuthUser{
// 			User: dao.User{
// 				Id:       user.Id,
// 				Username: user.Username,
// 			},
// 			Token: sessionToken,
// 		},
// 	})
// 	return nil
// }

// func Register(c *fiber.Ctx, dbClient *gorm.DB, config *toml.Tree) error {

// 	var registerRequest RegisterRequest
// 	if err := c.BodyParser(&registerRequest); err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "请检查请求参数是否正确",
// 		})
// 		return err
// 	}
// 	// Validate the username and password
// 	if registerRequest.Username == "" || registerRequest.Password == "" {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "用户名和密码不能为空",
// 		})
// 		return nil
// 	}

// 	// Check if the user exists in the database
// 	var user dao.User
// 	if err := dbClient.Where("username = ?", registerRequest.Username).First(&user).Error; err != nil {
// 		if err != gorm.ErrRecordNotFound {
// 			c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 				Code: 500,
// 				Msg:  "服务器异常",
// 			})
// 			return nil
// 		}
// 	}
// 	if user.Username != "" {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "注册用户已存在",
// 		})
// 		return nil
// 	}
// 	encryPwd, err := encryption.EncryptionMd5(registerRequest.Password, config.Get("env.PASSWORD_SALT").(string))
// 	if err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	user.Username = registerRequest.Username
// 	user.Password = encryPwd
// 	if err := dbClient.Create(&user).Error; err != nil {
// 		c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 			Code: 500,
// 			Msg:  "服务器异常",
// 		})
// 		return err
// 	}
// 	// Return the session token to the client
// 	c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 		Code: 200,
// 		Msg:  "注册成功",
// 	})
// 	return nil
// }

// func GetInfo(c *fiber.Ctx, dbClient *gorm.DB) error {
// 	userInfoAny := c.Locals(common.ContextUserKey)
// 	userInfo, ok := userInfoAny.(dao.User)
// 	if !ok {
// 		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
// 			"error": "failed to parse user info",
// 		})
// 	}
// 	c.Status(fiber.StatusOK).JSON(types.CommonResponse{
// 		Code: 200,
// 		Msg:  "获取成功",
// 		Data: dao.User{
// 			Id:       userInfo.Id,
// 			Username: userInfo.Username,
// 		},
// 	})
// 	return nil
// }
